home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / xpicw / xpicw110.lzh / WLSource / raster.s < prev    next >
Encoding:
Text File  |  1997-04-10  |  7.3 KB  |  406 lines

  1. *    Raster.s
  2. *        ラスタースクロール / 最高速 = 1
  3. *
  4. *    注意事項
  5. *        ワイプ中、Timer-C/D を停止します。
  6. *        音楽演奏しながらワイプする場合、ラスタースクロールに対応した
  7. *        音源ドライバを使用して下さい( ZMUSIC.X なら ZMUSIC.X -M で常駐して下さい)。
  8.  
  9.  
  10. SPEED_MAX    equ    1
  11.  
  12.     .offset    8        * 引き数
  13. _source_ptr:    .ds.l    1
  14. _dest_ptr:    .ds.l    1
  15. _speed:        .ds.l    1
  16. _vdisp:        .ds.l    1
  17.  
  18.  
  19.  
  20. gpos    .macro    pos_x,pos_y
  21.     .dc.w    (pos_y*1024)+(pos_x*2)
  22.     .endm
  23.  
  24.  
  25.     .include    IOCSCALL.MAC
  26.  
  27. CRTC_R09    equ    $e8_0012    * ラスター割り込み位置
  28. CRTC_R12    equ    $e8_0018    * スクロールX座標
  29. CRTC_R14    equ    $e8_001c
  30. CRTC_R16    equ    $e8_0020
  31. CRTC_R18    equ    $e8_0024
  32. GPIP_DATA    equ    $e8_8001
  33. MFP_IERB    equ    $e8_8009
  34. MFP_IMRB    equ    $e8_8015
  35.  
  36.  
  37.     .offset    0
  38. old_mfp_ierb:
  39.     .ds.b    1        * MFP レジスタ退避用
  40. old_mfp_imrb:
  41.     .ds.b    1
  42.  
  43.     .even
  44. raster_num:            * 割り込むラスター
  45.     .ds.w    1        * CRTC_R09 に入れる値
  46. counter:
  47.     .ds.w    1
  48. counter_2:
  49.     .ds.w    1
  50. counter_from:
  51.     .ds.w    1
  52. counter_to:
  53.     .ds.w    1
  54. amplitude_counter:        * 振幅カウンター
  55.     .ds.w    1        *  初期値 0->256->512 : 振幅 0->256->0
  56. amplitude:            * 振幅
  57.     .ds.w    1        *  振幅 0->256->0
  58. amplitude_inc:            * 振幅に加算する数値
  59.     .ds.w    1
  60.  
  61.     .even
  62. WORKSIZE:
  63.  
  64.  
  65.     .text
  66.     .even
  67.  
  68.     .dc.b    'WL10',$0d,$0a
  69.     .dc.b    'ラスタースクロール / 最高速 = 1',$0d,$0a
  70.     .dc.b    '    by Mitsuky',$0d,$0a
  71.     .dc.b    $1a
  72.  
  73.     .even
  74. Raster:
  75.     link    a6,#0
  76.     movem.l    d1-d7/a0-a5,-(sp)
  77.  
  78.     move.l    _speed(a6),d0    * d0.w =
  79.     bmi    main_ask_speed
  80.     cmpi.l    #SPEED_MAX,d0
  81.     bhi    main_err
  82.  
  83.     tst.l    _vdisp(a6)
  84.     bmi    main_ask_vdisp
  85.  
  86.  
  87.     lea.l    work(pc),a0
  88.     move.b    MFP_IERB,old_mfp_ierb(a0)    * MFP のレジスタを保存
  89.     move.b    MFP_IMRB,old_mfp_imrb(a0)
  90.     andi.b    #$cf,MFP_IERB        * Timer - C / D 停止
  91.     andi.b    #$cf,MFP_IMRB        *    〃    マスク
  92.  
  93.  
  94.     lea.l    work(pc),a0
  95.     clr.w    raster_num(a0)        * 割り込むラスター
  96.     clr.w    counter(a0)
  97.     clr.w    amplitude_counter(a0)
  98.     clr.w    amplitude(a0)
  99.  
  100.     tst.l    _speed(a6)
  101.     bne    1f
  102.             * 速度 = 0
  103.     move.w    #256-64,counter_from(a0)
  104.     move.w    #256+64,counter_to(a0)
  105.     move.w    #1,amplitude_inc(a0)
  106.     bra    2f
  107. 1:            * 速度 = 1
  108.     move.w    #256/2-64,counter_from(a0)
  109.     move.w    #256/2+64,counter_to(a0)
  110.     move.w    #2,amplitude_inc(a0)
  111. 2:
  112.  
  113.     bsr    vdisp
  114.  
  115.     moveq.l    #40,d1
  116.     lea.l    hsync_routine(pc),a1
  117.     IOCS    _CRTCRAS
  118.     tst.l    d0
  119.     bne    main_err
  120.  
  121.  
  122.  
  123.     movea.l    _source_ptr(a6),a2    * a2.l = 転送元アドレス・その1
  124.     movea.l    _dest_ptr(a6),a3    * a3.l = 転送先アドレス・その1
  125.     lea.l    table(pc),a4        * a4.l = テーブル
  126.  
  127.  
  128. loop:
  129.     bsr    vdisp        *! debug
  130.  
  131.     lea.l    work(pc),a0
  132.     move.w    counter(a0),d0
  133.     move.w    d0,counter_2(a0)
  134.     addq.w    #1,d0
  135.     move.w    d0,counter(a0)
  136.  
  137.     move.w    amplitude_counter(a0),d0
  138.     add.w    amplitude_inc(a0),d0
  139.     move.w    d0,amplitude_counter(a0)
  140.     cmpi.w    #256,d0
  141.     bls    @f
  142.     move.w    #512,d1
  143.     sub.w    d0,d1
  144.     move.w    d1,d0
  145. @@:    move.w    d0,amplitude(a0)
  146.  
  147.  
  148.     move.w    counter(a0),d0
  149.     cmp.w    counter_from(a0),d0
  150.     bcs    main_no_trans
  151.     cmp.w    counter_to(a0),d0
  152.     bcc    main_no_trans
  153.  
  154.  
  155.     movea.l    a2,a0
  156.     movea.l    a3,a1
  157.  
  158.     lsr.w    d0
  159.     bcc    @f
  160.  
  161.     adda.l    #256*1024,a0
  162.     adda.l    #256*1024,a1
  163.     adda.w    (a4),a2
  164.     adda.w    (a4)+,a3
  165. @@:
  166.  
  167.  
  168.     moveq.l    #64/2-1,d5
  169. main_loop_y:
  170.     moveq.l    #64/32-1,d4
  171. main_loop_x:
  172.     move.w    (a0),(a1)
  173.     move.w    16*1(a0),16*1(a1)
  174.     move.w    16*2(a0),16*2(a1)
  175.     move.w    16*3(a0),16*3(a1)
  176.     move.w    16*4(a0),16*4(a1)
  177.     move.w    16*5(a0),16*5(a1)
  178.     move.w    16*6(a0),16*6(a1)
  179.     move.w    16*7(a0),16*7(a1)
  180.     move.w    16*8(a0),16*8(a1)
  181.     move.w    16*9(a0),16*9(a1)
  182.     move.w    16*10(a0),16*10(a1)
  183.     move.w    16*11(a0),16*11(a1)
  184.     move.w    16*12(a0),16*12(a1)
  185.     move.w    16*13(a0),16*13(a1)
  186.     move.w    16*14(a0),16*14(a1)
  187.     move.w    16*15(a0),16*15(a1)
  188.     move.w    16*16(a0),16*16(a1)
  189.     move.w    16*17(a0),16*17(a1)
  190.     move.w    16*18(a0),16*18(a1)
  191.     move.w    16*19(a0),16*19(a1)
  192.     move.w    16*20(a0),16*20(a1)
  193.     move.w    16*21(a0),16*21(a1)
  194.     move.w    16*22(a0),16*22(a1)
  195.     move.w    16*23(a0),16*23(a1)
  196.     move.w    16*24(a0),16*24(a1)
  197.     move.w    16*25(a0),16*25(a1)
  198.     move.w    16*26(a0),16*26(a1)
  199.     move.w    16*27(a0),16*27(a1)
  200.     move.w    16*28(a0),16*28(a1)
  201.     move.w    16*29(a0),16*29(a1)
  202.     move.w    16*30(a0),16*30(a1)
  203.     move.w    16*31(a0),16*31(a1)
  204.     lea.l    16*32(a0),a0
  205.     lea.l    16*32(a1),a1
  206.     dbra    d4,main_loop_x
  207.  
  208.     lea.l    7*512*2(a0),a0
  209.     lea.l    7*512*2(a1),a1
  210.     dbra    d5,main_loop_y
  211.  
  212. main_no_trans:
  213.  
  214.     lea.l    work(pc),a0
  215.     move.w    amplitude_counter(a0),d0
  216.     cmpi.w    #512,d0
  217.     bne    loop
  218.  
  219.  
  220. main_rts:
  221.     suba.l    a1,a1
  222.     IOCS    _CRTCRAS
  223.  
  224.     lea.l    work(pc),a0
  225.     move.b    old_mfp_ierb(a0),MFP_IERB
  226.     move.b    old_mfp_imrb(a0),MFP_IMRB
  227.  
  228.     moveq.l    #0,d0
  229.     move.w    d0,CRTC_R12
  230.     move.w    d0,CRTC_R14
  231.     move.w    d0,CRTC_R16
  232.     move.w    d0,CRTC_R18
  233.     moveq.l    #0,d0
  234. main_rts_2:
  235.     movem.l    (sp)+,d1-d7/a0-a5
  236.     unlk    a6
  237.     rts
  238.  
  239.  
  240. ****    ****
  241. main_err:
  242.     moveq.l    #-1,d0
  243.     bra    main_rts_2
  244.  
  245.  
  246. ****    ****
  247. main_ask_speed:
  248.     moveq.l    #SPEED_MAX,d0
  249.     bra    main_rts_2
  250.  
  251.  
  252. ****    ****
  253. main_ask_vdisp:
  254.     move.l    _speed(a6),d0
  255.     lea.l    ask_vdisp_table(pc),a0
  256.     add.w    d0,d0
  257.     move.w    (a0,d0.w),d0
  258.     bra    main_rts_2
  259.  
  260. ask_vdisp_table:
  261.     .dc.w    512+1,256+1
  262.  
  263.  
  264. ****    ****
  265. vdisp:
  266.     movem.l    a0,-(sp)
  267.     move.l    _vdisp(a6),a0
  268.     jsr    (a0)
  269.     movem.l    (sp)+,a0
  270.     rts
  271.  
  272.  
  273. *********************************************************
  274. hsync_routine:
  275.     movem.l    d0/a0,-(sp)
  276. *    move.w    sr,-(sp)
  277. *    ori.w    #$0700,sr
  278.  
  279.     lea.l    work(pc),a0
  280.     move.w    raster_num(a0),d0
  281. *    addq.w    #1,d0
  282.     addq.w    #2,d0
  283.  
  284.     andi.w    #511,d0
  285.     move.w    d0,raster_num(a0)
  286.     addi.w    #40,d0
  287.     move.w    d0,CRTC_R09
  288.  
  289.  
  290.     move.w    counter_2(a0),d0
  291.     addq.w    #2,d0
  292.     move.w    d0,counter_2(a0)
  293.     andi.w    #127,d0
  294.     add.w    d0,d0
  295.     move.w    sintable(pc,d0.w),d0
  296.  
  297.     muls.w    amplitude(a0),d0
  298.     swap.w    d0
  299.     add.w    d0,d0
  300.  
  301.     move.w    d0,CRTC_R12
  302.     move.w    d0,CRTC_R14
  303.     move.w    d0,CRTC_R16
  304.     move.w    d0,CRTC_R18
  305.  
  306. hsync_routine_rts:
  307. *    move.w    (sp)+,sr
  308.     movem.l    (sp)+,d0/a0
  309.     rte
  310.  
  311.  
  312. *********************************************************
  313. sintable:
  314.     .dc.w    0,1607,3211,4807,6392,7961,9511,11038
  315.     .dc.w    12539,14009,15446,16845,18204,19519,20787,22004
  316.     .dc.w    23169,24278,25329,26318,27244,28105,28897,29621
  317.     .dc.w    30272,30851,31356,31785,32137,32412,32609,32727
  318.     .dc.w    32767,32727,32609,32412,32137,31785,31356,30851
  319.     .dc.w    30272,29621,28897,28105,27244,26318,25329,24278
  320.     .dc.w    23169,22004,20787,19519,18204,16845,15446,14009
  321.     .dc.w    12539,11038,9511,7961,6392,4807,3211,1607
  322.     .dc.w    0,-1607,-3211,-4807,-6392,-7961,-9511,-11038
  323.     .dc.w    -12539,-14009,-15446,-16845,-18204,-19519,-20787,-22004
  324.     .dc.w    -23169,-24278,-25329,-26318,-27244,-28105,-28897,-29621
  325.     .dc.w    -30272,-30851,-31356,-31785,-32137,-32412,-32609,-32727
  326.     .dc.w    -32767,-32727,-32609,-32412,-32137,-31785,-31356,-30851
  327.     .dc.w    -30272,-29621,-28897,-28105,-27244,-26318,-25329,-24278
  328.     .dc.w    -23169,-22004,-20787,-19519,-18204,-16845,-15446,-14009
  329.     .dc.w    -12539,-11038,-9511,-7961,-6392,-4807,-3211,-1607
  330.  
  331. work:
  332.     .ds.b    WORKSIZE
  333.     .even
  334.  
  335. *********************************************************
  336. table:
  337.     gpos    4,4
  338.     gpos    -2,2
  339.     gpos    3,-5
  340.     gpos    2,2
  341.     gpos    -5,-1
  342.     gpos    4,4
  343.     gpos    -3,1
  344.     gpos    4,-6
  345.     gpos    -7,3
  346.     gpos    7,3
  347.     gpos    -3,-5
  348.     gpos    -3,3
  349.     gpos    5,-5
  350.     gpos    -3,3
  351.     gpos    2,4
  352.     gpos    1,-5
  353.     gpos    -4,-2
  354.     gpos    1,5
  355.     gpos    3,-1
  356.     gpos    -3,-3
  357.     gpos    4,4
  358.     gpos    -6,-2
  359.     gpos    3,3
  360.     gpos    1,-3
  361.     gpos    -1,-3
  362.     gpos    -4,2
  363.     gpos    1,5
  364.     gpos    4,-2
  365.     gpos    -4,-4
  366.     gpos    -1,5
  367.     gpos    2,-2
  368.  
  369.     gpos    -1,-4
  370.  
  371.     gpos    4,4
  372.     gpos    -2,2
  373.     gpos    3,-5
  374.     gpos    -6,2
  375.     gpos    3,-1
  376.     gpos    4,4
  377.     gpos    -3,1
  378.     gpos    -4,-6
  379.     gpos    1,3
  380.     gpos    -1,3
  381.     gpos    5,-5
  382.     gpos    -3,3
  383.     gpos    5,-5
  384.     gpos    -3,3
  385.     gpos    2,4
  386.     gpos    1,-5
  387.     gpos    -4,-2
  388.     gpos    1,5
  389.     gpos    3,-1
  390.     gpos    -3,-3
  391.     gpos    -4,4
  392.     gpos    2,-2
  393.     gpos    3,3
  394.     gpos    1,-3
  395.     gpos    -1,-3
  396.     gpos    -4,2
  397.     gpos    1,5
  398.     gpos    4,-2
  399.     gpos    -4,-4
  400.     gpos    -1,5
  401.     gpos    2,-2
  402.  
  403.     gpos    0,0    * ダミー(一応)
  404.  
  405.  
  406.